package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strings"
	"time"
)

/**
 * 递归查询文件，来处理
 * rootPath 源码路径
 * newPath 生成新文件的路径
 * 初步设想。生成 _zh 文件夹，翻译过的源码都放在此目录下
 */
func RecursionFile(rootPath, newPath string, ch chan<- tranFile) {
	ok, err := PathExists(newPath)
	if err != nil {
		fmt.Printf("判断文件夹是否存在失败：！%v \n", err)
	}
	if !ok {
		os.MkdirAll(newPath, os.ModePerm)
	}

	file, err := ioutil.ReadDir(rootPath)
	if err != nil {
		fmt.Printf("文件读取失败！%v \n", err)
		return
	}

	for _, fil := range file {
		if fil.IsDir() {
			err := os.MkdirAll(newPath+"\\"+fil.Name(), os.ModePerm)
			if err != nil {
				fmt.Printf("文件夹创建失败！%v \n", err)
			}
			RecursionFile(rootPath+"\\"+fil.Name(), newPath+"\\"+fil.Name(), ch)
			continue
		}
		// 如果是java文件，找到注释内容，调用api将英文转换成中文
		if strings.HasSuffix(fil.Name(), ".java") {
			t := tranFile{
				filePath: newPath + "\\" + fil.Name(),
				newPath:  rootPath + "\\" + fil.Name(),
			}
			ch <- t
			//translate(newPath + "\\" + fil.Name(),rootPath + "\\" + fil.Name())
		} else {
			// 如果不是java文件直接将文件复制到指定路径下，不做处理
			CopyFile(newPath+"\\"+fil.Name(), rootPath+"\\"+fil.Name())
		}
	}
}

func translate2(ch <-chan tranFile) {
	defer Wg.Done()
	for true {
		elem, ok := <-ch
		if !ok {
			return
		}

		file, err := ioutil.ReadFile(elem.filePath)
		if err != nil {
			fmt.Printf("fild %v \n", err)
			continue
			//return
		}
		s := string(file)
		split := strings.Split(s, "\n")
		// 在 ZH目录中创建相同的文件
		openFile, err := os.OpenFile(elem.newPath, os.O_CREATE|os.O_RDWR, 0644)
		if err != nil {
			fmt.Printf("creat file fild %v \n", err)
		}
		// 关闭文件
		defer openFile.Close()

		// 创建变量保存翻译过的注释内容
		var str string

		for _, ind := range split {
			openFile.WriteString("\n")

			spaceStr := strings.TrimSpace(ind)

			if strings.HasPrefix(spaceStr, NOTES_1) {

				// 当前行为单行注释需要处理
				openFile.WriteString(ind)

				openFile.WriteString("\n")
				replace := strings.Replace(ind, NOTES_1, "", 1)

				// 睡眠一秒在翻译
				time.Sleep(time.Second)

				// 获取处理过的翻译注释
				st := ind[0:strings.Index(ind, NOTES_1)] + "// " + zhToEn(replace)

				openFile.WriteString(st)
				continue
			}
			if !NOTES && strings.HasPrefix(spaceStr, NOTES_2) {
				// 多行注释的开头
				NOTES = true
				openFile.WriteString(ind)
				// 开始拼接多行注释
				str = ind
				continue
			}
			if NOTES && strings.HasPrefix(spaceStr, NOTES_3) {
				// 多行注释的结尾
				NOTES = false
				str = str + "\n" + ind
				openFile.WriteString(ind)
				openFile.WriteString("\n")
				openFile.WriteString(str)
				continue
			}
			if NOTES {
				// 多行注释中的内容，需要处理后将字符拼接
				openFile.WriteString(ind)
				if "*" == spaceStr {
					str = str + "\n" + ind
				} else {
					// 睡眠一秒在翻译 百度翻译的qps 为10
					time.Sleep(time.Second)
					str = str + "\n" + ind[0:len(ind)-len(spaceStr)] + zhToEn(spaceStr)
				}
				continue
			}
			openFile.WriteString(ind)
		}

	}
}

/**
 * 文件处理 将java 源码中的注释调用翻译api 生成中文注释
 * 保存到指定目录，
 * dstName 需要保存的路径
 * srcName 源文件路径
 */
func translate(dstName, srcName string) {
	// 读取文件内容
	file, err := ioutil.ReadFile(srcName)
	if err != nil {
		fmt.Printf("fild %v \n", err)
		return
	}
	s := string(file)
	split := strings.Split(s, "\n")
	// 在 ZH目录中创建相同的文件
	openFile, err := os.OpenFile(dstName, os.O_CREATE|os.O_RDWR, 0644)
	if err != nil {
		fmt.Printf("creat file fild %v \n", err)
	}
	// 关闭文件
	defer openFile.Close()

	// 创建变量保存翻译过的注释内容
	var str string

	for _, ind := range split {
		openFile.WriteString("\n")

		spaceStr := strings.TrimSpace(ind)

		if strings.HasPrefix(spaceStr, NOTES_1) {

			// 当前行为单行注释需要处理
			openFile.WriteString(ind)

			openFile.WriteString("\n")
			replace := strings.Replace(ind, NOTES_1, "", 1)

			// 睡眠一秒在翻译
			time.Sleep(time.Second)

			// 获取处理过的翻译注释
			st := ind[0:strings.Index(ind, NOTES_1)] + "// " + zhToEn(replace)

			openFile.WriteString(st)
			continue
		}
		if !NOTES && strings.HasPrefix(spaceStr, NOTES_2) {
			// 多行注释的开头
			NOTES = true
			openFile.WriteString(ind)
			// 开始拼接多行注释
			str = ind
			continue
		}
		if NOTES && strings.HasPrefix(spaceStr, NOTES_3) {
			// 多行注释的结尾
			NOTES = false
			str = str + "\n" + ind
			openFile.WriteString(ind)
			openFile.WriteString("\n")
			openFile.WriteString(str)
			continue
		}
		if NOTES {
			// 多行注释中的内容，需要处理后将字符拼接
			openFile.WriteString(ind)
			if "*" == spaceStr {
				str = str + "\n" + ind
			} else {
				// 睡眠一秒在翻译
				time.Sleep(time.Second)
				str = str + "\n" + ind[0:len(ind)-len(spaceStr)] + zhToEn(spaceStr)
			}
			continue
		}
		openFile.WriteString(ind)
	}
}

// 判断文件夹是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// 复制文件
func CopyFile(dstName, srcName string) (written int64, err error) {
	src, err := os.Open(srcName)
	if err != nil {
		return
	}
	defer src.Close()
	dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		return
	}
	defer dst.Close()
	return io.Copy(dst, src)
}
